home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / lang / fpc09905c.lha / fpc / inc / rttip.inc < prev    next >
Text File  |  1998-09-21  |  5KB  |  171 lines

  1. {
  2.     $Id: rttip.inc,v 1.2 1998/06/08 19:26:53 michael Exp $
  3.     This file is part of the Free Pascal run time library.
  4.     Copyright (c) 1993,97 by xxxx
  5.     member of the Free Pascal development team
  6.  
  7.     See the file COPYING.FPC, included in this distribution,
  8.     for details about the copyright.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13.  
  14.  **********************************************************************}
  15.  
  16. { Run-Time type information routines - processor dependent part }
  17.  
  18.  
  19. Procedure Initialize (Data,TypeInfo : pointer);[Alias : 'INITIALIZE'];
  20.  
  21. Var Temp       : PByte;
  22.     I          : longint;
  23.     Size,Count : longint;
  24.     TInfo : Pointer;
  25.      
  26. begin
  27.   Temp:=PByte(TypeInfo);
  28.   case temp^ of 
  29.     tkLstring,tkWstring : PPchar(Data)^:=Nil;
  30.     tkArray :
  31.       begin
  32.       temp:=Temp+1;
  33.       I:=temp^; 
  34.       temp:=temp+(I+1);               // skip name string;
  35.       Size:=PArrayRec(Temp)^.Size;     // get element size
  36.       Count:=PArrayRec(Temp)^.Count;  // get element Count
  37.       TInfo:=PArrayRec(Temp)^.Info;   // Get element info 
  38.       For I:=0 to Count-1 do
  39.         Initialize (Data+(I*size),TInfo);   
  40.       end; 
  41.     tkrecord :
  42.       begin
  43.       Temp:=Temp+1;
  44.       I:=Temp^;
  45.       temp:=temp+(I+1);             // skip name string;
  46.       Size:=PRecRec(Temp)^.Size;    // get record size; not needed.
  47.       Count:=PRecRec(Temp)^.Count;  // get element Count
  48.       For I:=1 to count Do 
  49.         With PRecRec(Temp)^.elements[I] do
  50.           Initialize (Data+Offset,Info);
  51.       end;
  52.   end;
  53. end;
  54.  
  55. Procedure Finalize (Data,TypeInfo: Pointer);[Alias : 'FINALIZE'];
  56.  
  57. Var Temp       : PByte;
  58.     I          : longint;
  59.     Size,Count : longint;
  60.     TInfo : Pointer;
  61.  
  62. begin
  63.   Temp:=PByte(TypeInfo);
  64.   case temp^ of 
  65.     tkLstring,tkWstring : Decr_Ansi_ref(Data);
  66.     tkArray :
  67.       begin
  68.       Temp:=Temp+1;
  69.       I:=temp^; 
  70.       temp:=temp+(I+1);               // skip name string;
  71.       Size:=PArrayRec(Temp)^.Size;     // get element size
  72.       Count:=PArrayRec(Temp)^.Count;  // get element Count
  73.       TInfo:=PArrayRec(Temp)^.Info;   // Get element info 
  74.       For I:=0 to Count-1 do
  75.         Finalize (Data+(I*size),TInfo);   
  76.       end; 
  77.     tkrecord :
  78.       begin
  79.       Temp:=Temp+1;
  80.       I:=Temp^;
  81.       temp:=temp+(I+1);             // skip name string;
  82.       Size:=PRecRec(Temp)^.Size;    // get record size; not needed.
  83.       Count:=PRecRec(Temp)^.Count;  // get element Count
  84.       For I:=1 to count do 
  85.         With PRecRec(Temp)^.elements[I] do
  86.           Finalize (Data+Offset,Info);
  87.       end;
  88.   end;
  89. end;
  90.  
  91. Procedure Addref (Data,TypeInfo : Pointer); [alias : 'ADDREF'];
  92.  
  93. Var Temp       : PByte;
  94.     I          : longint;
  95.     Size,Count : longint;
  96.     TInfo : Pointer;
  97.  
  98. begin
  99.   Temp:=PByte(TypeInfo);
  100.   case temp^ of 
  101.     tkLstring,tkWstring : Incr_Ansi_ref(Data);
  102.     tkArray :
  103.       begin
  104.       Temp:=Temp+1;
  105.       I:=temp^; 
  106.       temp:=temp+(I+1);               // skip name string;
  107.       Size:=PArrayRec(Temp)^.Size;     // get element size
  108.       Count:=PArrayRec(Temp)^.Count;  // get element Count
  109.       TInfo:=PArrayRec(Temp)^.Info;   // Get element info 
  110.       For I:=0 to Count-1 do
  111.         AddRef (Data+(I*size),TInfo);   
  112.       end; 
  113.     tkrecord :
  114.       begin
  115.       Temp:=Temp+1;
  116.       I:=Temp^;
  117.       temp:=temp+(I+1);             // skip name string;
  118.       Size:=PRecRec(Temp)^.Size;    // get record size; not needed.
  119.       Count:=PRecRec(Temp)^.Count;  // get element Count
  120.       For I:=1 to count do 
  121.         With PRecRec(Temp)^.elements[I] do
  122.           AddRef (Data+Offset,Info);
  123.       end;
  124.   end;
  125. end;
  126.  
  127. Procedure DecRef (Data, TypeInfo : Pointer);
  128.  
  129. Var Temp       : PByte;
  130.     I          : longint;
  131.     Size,Count : longint;
  132.     TInfo : Pointer;
  133.  
  134. begin
  135.   Temp:=PByte(TypeInfo);
  136.   case temp^ of 
  137.     tkLstring,tkWstring : Decr_Ansi_ref(Data);
  138.     tkArray :
  139.       begin
  140.       Temp:=Temp+1;
  141.       I:=temp^; 
  142.       temp:=temp+(I+1);               // skip name string;
  143.       Size:=PArrayRec(Temp)^.Size;     // get element size
  144.       Count:=PArrayRec(Temp)^.Count;  // get element Count
  145.       TInfo:=PArrayRec(Temp)^.Info;   // Get element info 
  146.       For I:=0 to Count-1 do
  147.         DecRef (Data+(I*size),TInfo);   
  148.       end; 
  149.     tkrecord :
  150.       begin
  151.       Temp:=Temp+1;
  152.       I:=Temp^;
  153.       temp:=temp+(I+1);             // skip name string;
  154.       Size:=PRecRec(Temp)^.Size;    // get record size; not needed.
  155.       Count:=PRecRec(Temp)^.Count;  // get element Count
  156.       For I:=1 to count do 
  157.         With PRecRec(Temp)^.elements[I] do
  158.           DecRef (Data+Offset,Info);
  159.       end;
  160.   end;
  161. end;
  162.  
  163. {
  164.  $Log: rttip.inc,v $
  165.  Revision 1.2  1998/06/08 19:26:53  michael
  166.  + Implemented DecRef
  167.  
  168.  Revision 1.1  1998/06/08 15:32:08  michael
  169.  + Split rtti according to processor. Implemented optimized i386 code.
  170.  
  171. }